In [5]:
import numpy as np
import matplotlib.pyplot as plt
%pylab inline
In [6]:
x0 = 0 # starting point
h = 0.5 # step
def func(x):
return - (3 - np.power(x, 2)) * x # our function
In [7]:
fig, ax = plt.subplots()
x = np.linspace(-3, 3, 100)
y = func(x)
ax.plot(x, y)
ax.grid(True)
In [9]:
def optimize_svenn(x0, h):
f0 = func(x0)
f0_add = func(x0 + h)
f0_sub = func(x0 - h)
xk1 = lambda xk0, t, k: (xk0 + 2.0 ** k * t)
if (f0 >= f0_sub) and (f0 >= f0_add):
return (None, None)
elif (f0 <= f0_sub) and (f0 <= f0_add):
return (x0 - h, x0 + h)
elif (f0 <= f0_sub) and (f0 >= f0_add):
a = x0
elif (f0 >= f0_sub) and (f0 <= f0_add):
h = -h
b = x0
k = 1
x1 = x0 + h
x2 = xk1(x1, h, k)
f1 = func(x1)
f2 = func(x2)
while f2 < f1:
if (h > 0):
a = x1
else:
b = x1
k += 1
x1, f1 = x2, f2
x2 = xk1(x1, h, k)
f2 = func(x2)
if (h > 0):
b = x2
else:
a = x2
return a, b
a, b = optimize_svenn(x0, h)
if a is not None and b is not None:
fa, fb = func(a), func(b)
ax.plot([a], [fa], "ro")
ax.text(a, fa - 2, "a")
ax.plot([b], [fb], "ro")
ax.text(b, fb - 2, "b")
print "a = {0}".format(a)
print "b = {0}".format(b)
else:
print "Function is not unimodal"
fig
Out[9]:
In [ ]: